will.nmid = "nm0000226";
will.movies = IMDB.getMoviesForPerson(will.nmid);
denzel.nmid = "nm0000243";
denzel.movies = IMDB.getMoviesForPerson(denzel.nmid);
will.info = IMDB.getPersonInfo(will.nmid);
denzel.info = IMDB.getPersonInfo(denzel.nmid);
will.info
denzel.info
#POPULAR MOVIES FROM 1980 THROUGH 2020
popular50 = subsetDataFrame(imdb.data$movies$popular50, "year", ">=", 1980)
popular50 = subsetDataFrame(popular50, "year", "<=", 2020)
dim(popular50)
library(devtools); # required for source_url
install_github("MonteShaffer/imdb/imdb");
#detach(package:imdb);
library(imdb);
packageVersion("imdb")
library(humanVerseWSU);
path.github = "https://raw.githubusercontent.com/MonteShaffer/humanVerseWSU/master/";
include.me = paste0(path.github, "misc/functions-nlp.R");
source_url( include.me );
include.me = paste0(path.github, "misc/functions-nlp-str.R");
source_url( include.me );
include.me = paste0(path.github, "misc/functions-nlp-stack.R");
source_url( include.me );
include.me = paste0(path.github, "misc/functions-nlp-pos.R");
source_url( include.me );
include.me = paste0(path.github, "humanVerseWSU/R/functions-encryption.R");
source_url( include.me );
###### UPDATES TO dataframe subset function ######
# inflation adjustments for NA ... and improvements on subsetting
include.me = paste0(path.github, "humanVerseWSU/R/functions-dataframe.R");
source_url( include.me );
include.me = paste0(path.github, "humanVerseWSU/R/functions-inflation.R");
source_url( include.me );
# path to project
path.project = "C:/_git_/WSU_STATS419_FALL2020/final/";
library(dplyr)
library(ggplot2)
library(gridExtra)
library(Hmisc)
library(knitr)
library(tidyr)

will.n = nrow(will.movies);
will.movies.r = replaceFactorColumnWithIndicatorVariables(will.movies, "genre", "genre", use.boolean=FALSE);
# colSums(will.cast.info.r[,11:34]);
will.genre.p = sort(colSums(will.movies.r[,7:24])/will.n, decreasing = TRUE); # proportion by movie
will.genre.p
denzel.n = nrow(denzel.movies);
denzel.movies.r = replaceFactorColumnWithIndicatorVariables(denzel.movies, "genre", "genre", use.boolean=FALSE);
# colSums(will.cast.info.r[,11:34]);
denzel.genre.p = sort(colSums(denzel.movies.r[,7:22])/denzel.n, decreasing = TRUE); # proportion by movie
denzel.genre.p
#
# g <-ggplot(sub.data.long, aes(x=as.factor(ttid))) +
# geom_bar(aes(fill=as.factor(type)), width = 0.5)+
# theme(axis.text.x = element_text(angle = 65, vjust = 0.6))
# g
library(xtable)
library(table1)
will.table = will.popular[,c(3,5,4,9,11,14)]
will.table = will.table[with(will.table,order(rank)),]
denzel.table = denzel.popular[,c(3,5,4,9,11,14)]
denzel.table = denzel.table[with(denzel.table,order(rank)),]
print(xtable(will.table, type = "latex"), file = "tables/will.table.tex")
#print(xtable(denzel.table, type = "latex"), file = "tables/denzel.table.tex")
# label(will.denzel.merge$ratings) <- "ratings"
# label(will.denzel.merge$votes) <- "votes"
# label(will.denzel.merge$rank.popular) <- "rank.popular"
# table1(~ratings + votes + rank.popular | nmid, data = will.denzel.merge)
library(kableExtra)
#webshot::install_phantomjs(force = TRUE)
# df <- will.popular[,c(9,11,41:48)]
# d <- summary(df)
# d %>%
# kbl(format="latex",caption = "Descriptive analyse of Will Smith popular 50",booktabs = TRUE) %>%
# kable_classic(full_width = T, html_font = "Cambria")
#
# print(xtable(d,"latex"), file="tables/test.tex")
LS0tDQp0aXRsZTogIldpbGwgdnMgRGVuemVsIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3IsYXBwZW5kaXgtc2V0dXAsbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoZGV2dG9vbHMpOyAgICAgICAjIHJlcXVpcmVkIGZvciBzb3VyY2VfdXJsDQppbnN0YWxsX2dpdGh1YigiTW9udGVTaGFmZmVyL2ltZGIvaW1kYiIpOw0KI2RldGFjaChwYWNrYWdlOmltZGIpOw0KbGlicmFyeShpbWRiKTsNCnBhY2thZ2VWZXJzaW9uKCJpbWRiIikNCg0KbGlicmFyeShodW1hblZlcnNlV1NVKTsNCg0KcGF0aC5naXRodWIgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL01vbnRlU2hhZmZlci9odW1hblZlcnNlV1NVL21hc3Rlci8iOw0KDQoNCmluY2x1ZGUubWUgPSBwYXN0ZTAocGF0aC5naXRodWIsICJtaXNjL2Z1bmN0aW9ucy1ubHAuUiIpOw0Kc291cmNlX3VybCggaW5jbHVkZS5tZSApOw0KaW5jbHVkZS5tZSA9IHBhc3RlMChwYXRoLmdpdGh1YiwgIm1pc2MvZnVuY3Rpb25zLW5scC1zdHIuUiIpOw0Kc291cmNlX3VybCggaW5jbHVkZS5tZSApOw0KaW5jbHVkZS5tZSA9IHBhc3RlMChwYXRoLmdpdGh1YiwgIm1pc2MvZnVuY3Rpb25zLW5scC1zdGFjay5SIik7DQpzb3VyY2VfdXJsKCBpbmNsdWRlLm1lICk7DQppbmNsdWRlLm1lID0gcGFzdGUwKHBhdGguZ2l0aHViLCAibWlzYy9mdW5jdGlvbnMtbmxwLXBvcy5SIik7DQpzb3VyY2VfdXJsKCBpbmNsdWRlLm1lICk7DQppbmNsdWRlLm1lID0gcGFzdGUwKHBhdGguZ2l0aHViLCAiaHVtYW5WZXJzZVdTVS9SL2Z1bmN0aW9ucy1lbmNyeXB0aW9uLlIiKTsNCnNvdXJjZV91cmwoIGluY2x1ZGUubWUgKTsNCiMjIyMjIyBVUERBVEVTIFRPIGRhdGFmcmFtZSBzdWJzZXQgZnVuY3Rpb24gIyMjIyMjDQojIGluZmxhdGlvbiBhZGp1c3RtZW50cyBmb3IgTkEgLi4uIGFuZCBpbXByb3ZlbWVudHMgb24gc3Vic2V0dGluZw0KaW5jbHVkZS5tZSA9IHBhc3RlMChwYXRoLmdpdGh1YiwgImh1bWFuVmVyc2VXU1UvUi9mdW5jdGlvbnMtZGF0YWZyYW1lLlIiKTsNCnNvdXJjZV91cmwoIGluY2x1ZGUubWUgKTsNCmluY2x1ZGUubWUgPSBwYXN0ZTAocGF0aC5naXRodWIsICJodW1hblZlcnNlV1NVL1IvZnVuY3Rpb25zLWluZmxhdGlvbi5SIik7DQpzb3VyY2VfdXJsKCBpbmNsdWRlLm1lICk7DQoNCiMgcGF0aCB0byBwcm9qZWN0DQpwYXRoLnByb2plY3QgPSAiQzovX2dpdF8vV1NVX1NUQVRTNDE5X0ZBTEwyMDIwL2ZpbmFsLyI7DQoNCmBgYA0KDQpgYGB7ciwgbGlicmFyaWVzfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHRpZHlyKQ0KYGBgDQoNCg0KYGBge3IgbG9hZF9kYXRhLCBlY2hvPUZBTFNFfQ0KaW1kYjo6bG9hZERhdGFJTURCKCk7DQpuYW1lcyhpbWRiLmRhdGEpOw0KYGBgDQoNCmBgYHtyIGdldF9tb3ZpZXN9DQp3aWxsLm5taWQgPSAibm0wMDAwMjI2IjsNCndpbGwubW92aWVzID0gSU1EQi5nZXRNb3ZpZXNGb3JQZXJzb24od2lsbC5ubWlkKTsNCg0KZGVuemVsLm5taWQgPSAibm0wMDAwMjQzIjsNCmRlbnplbC5tb3ZpZXMgPSBJTURCLmdldE1vdmllc0ZvclBlcnNvbihkZW56ZWwubm1pZCk7DQpgYGANCg0KYGBge3Igd2lsbF9hbmRfZGVuemVsX2Jpb30NCndpbGwuaW5mbyA9IElNREIuZ2V0UGVyc29uSW5mbyh3aWxsLm5taWQpOw0KZGVuemVsLmluZm8gPSBJTURCLmdldFBlcnNvbkluZm8oZGVuemVsLm5taWQpOw0KDQp3aWxsLmluZm8NCmRlbnplbC5pbmZvDQpgYGANCg0KDQpgYGB7ciBnZXRfcG9wdWxhcl81MH0NCiNQT1BVTEFSIE1PVklFUyBGUk9NIDE5ODAgVEhST1VHSCAyMDIwDQpwb3B1bGFyNTAgPSBzdWJzZXREYXRhRnJhbWUoaW1kYi5kYXRhJG1vdmllcyRwb3B1bGFyNTAsICJ5ZWFyIiwgIj49IiwgMTk4MCkNCnBvcHVsYXI1MCA9IHN1YnNldERhdGFGcmFtZShwb3B1bGFyNTAsICJ5ZWFyIiwgIjw9IiwgMjAyMCkNCmRpbShwb3B1bGFyNTApDQpgYGANCg0KYGBge3IgcG9wdWxhcl81MF9kZXRhaWwsIGVjaG89RkFMU0V9DQpwb3B1bGFyNTAuZGV0YWlsID0gbWVyZ2UocG9wdWxhcjUwLCBpbWRiLmRhdGEkbW92aWVzLmRmJGluZm8sIGJ5PSJ0dGlkIikNCnBvcHVsYXI1MC5kZXRhaWwNCmBgYA0KDQpgYGB7ciBidWlsZF9mZWF0dXJlcywgZWNobz1GQUxTRX0NCiMgd2UgY291bGQgcmFuayBvbiBvdGhlciBjb2x1bW5zIC4uLg0KDQpsb2FkSW5mbGF0aW9uRGF0YSgpOw0KDQojY2hhbmdlIGl0IHRvIG1pbGxpb25zDQpwb3B1bGFyNTAuZGV0YWlsJGJ1ZGdldC5taWxsaW9ucyA9IGFzLm51bWVyaWMocG9wdWxhcjUwLmRldGFpbCRidWRnZXQpLzEwMDAwMDANCnBvcHVsYXI1MC5kZXRhaWwkdXNhLm9wZW5pbmcubWlsbGlvbnMgPSBhcy5udW1lcmljKHBvcHVsYXI1MC5kZXRhaWwkdXNhLm9wZW5pbmcpLzEwMDAwMDANCnBvcHVsYXI1MC5kZXRhaWwkdXNhLmdyb3NzLm1pbGxpb25zID0gYXMubnVtZXJpYyhwb3B1bGFyNTAuZGV0YWlsJHVzYS5ncm9zcykvMTAwMDAwMA0KcG9wdWxhcjUwLmRldGFpbCR3b3JsZC5ncm9zcy5taWxsaW9ucyA9IGFzLm51bWVyaWMocG9wdWxhcjUwLmRldGFpbCR3b3JsZC5ncm9zcykvMTAwMDAwMA0KcG9wdWxhcjUwLmRldGFpbCRpbnRlcm5hdGlvbmFsLmdyb3NzLm1pbGxpb25zID0gcG9wdWxhcjUwLmRldGFpbCR3b3JsZC5ncm9zcy5taWxsaW9ucyAtIHBvcHVsYXI1MC5kZXRhaWwkdXNhLmdyb3NzLm1pbGxpb25zDQpwb3B1bGFyNTAuZGV0YWlsJHVzYS5wcm9maXQubWlsbGlvbnMgPSBwb3B1bGFyNTAuZGV0YWlsJHVzYS5ncm9zcy5taWxsaW9ucyAtIHBvcHVsYXI1MC5kZXRhaWwkYnVkZ2V0Lm1pbGxpb25zDQpwb3B1bGFyNTAuZGV0YWlsJHdvcmxkLnByb2ZpdC5taWxsaW9ucyA9IHBvcHVsYXI1MC5kZXRhaWwkd29ybGQuZ3Jvc3MubWlsbGlvbnMgLSBwb3B1bGFyNTAuZGV0YWlsJGJ1ZGdldC5taWxsaW9ucw0KcG9wdWxhcjUwLmRldGFpbCRpbnRlcm5hdGlvbmFsLnByb2ZpdC5taWxsaW9ucyA9IHBvcHVsYXI1MC5kZXRhaWwkd29ybGQucHJvZml0Lm1pbGxpb25zIC0gcG9wdWxhcjUwLmRldGFpbCR1c2EucHJvZml0Lm1pbGxpb25zDQoNCnBvcHVsYXI1MC5kZXRhaWwNCmBgYA0KDQpgYGB7ciBhZGp1c3RfaW5mbGF0aW9uLCBlY2hvPUZBTFNFfQ0KI2FkamVzdCBmb3IgaW5mbGF0aW9uIHRvIHllYXIgMjAwMA0KDQpwb3B1bGFyNTAuZGV0YWlsID0gc3RhbmRhcmRpemVEb2xsYXJzSW5EYXRhRnJhbWUocG9wdWxhcjUwLmRldGFpbCwgMjAwMCwgImJ1ZGdldC5taWxsaW9ucyIsICJ5ZWFyIiwgImJ1ZGdldC5taWxsaW9uczIwMDAiKTsNCnBvcHVsYXI1MC5kZXRhaWwgPSBzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAidXNhLm9wZW5pbmcubWlsbGlvbnMiLCAieWVhciIsICJ1c2Eub3BlbmluZy5taWxsaW9uczIwMDAiKTsNCnBvcHVsYXI1MC5kZXRhaWwgPSBzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAidXNhLmdyb3NzLm1pbGxpb25zIiwgInllYXIiLCAidXNhLmdyb3NzLm1pbGxpb25zMjAwMCIpOw0KcG9wdWxhcjUwLmRldGFpbCA9IHN0YW5kYXJkaXplRG9sbGFyc0luRGF0YUZyYW1lKHBvcHVsYXI1MC5kZXRhaWwsIDIwMDAsICJ3b3JsZC5ncm9zcy5taWxsaW9ucyIsICJ5ZWFyIiwgIndvcmxkLmdyb3NzLm1pbGxpb25zMjAwMCIpOw0KcG9wdWxhcjUwLmRldGFpbCA9IHN0YW5kYXJkaXplRG9sbGFyc0luRGF0YUZyYW1lKHBvcHVsYXI1MC5kZXRhaWwsIDIwMDAsICJpbnRlcm5hdGlvbmFsLmdyb3NzLm1pbGxpb25zIiwgInllYXIiLCAiaW50ZXJuYXRpb25hbC5ncm9zcy5taWxsaW9uczIwMDAiKTsNCnBvcHVsYXI1MC5kZXRhaWwgPSBzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAidXNhLnByb2ZpdC5taWxsaW9ucyIsICJ5ZWFyIiwgInVzYS5wcm9maXQubWlsbGlvbnMyMDAwIik7DQpwb3B1bGFyNTAuZGV0YWlsID0gc3RhbmRhcmRpemVEb2xsYXJzSW5EYXRhRnJhbWUocG9wdWxhcjUwLmRldGFpbCwgMjAwMCwgIndvcmxkLnByb2ZpdC5taWxsaW9ucyIsICJ5ZWFyIiwgIndvcmxkLnByb2ZpdC5taWxsaW9uczIwMDAiKTsNCnBvcHVsYXI1MC5kZXRhaWwgPSBzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAiaW50ZXJuYXRpb25hbC5wcm9maXQubWlsbGlvbnMiLCAieWVhciIsICJpbnRlcm5hdGlvbmFsLnByb2ZpdC5taWxsaW9uczIwMDAiKTsNCg0KIyBwb3B1bGFyNTAuZGV0YWlsID0gZm9ybWF0KHN0YW5kYXJkaXplRG9sbGFyc0luRGF0YUZyYW1lKHBvcHVsYXI1MC5kZXRhaWwsIDIwMDAsICJidWRnZXQubWlsbGlvbnMiLCAieWVhciIsICJidWRnZXQubWlsbGlvbnMyMDAwIiksc2NpZW50aWZpYz1GQUxTRSk7DQojIHBvcHVsYXI1MC5kZXRhaWwgPSBmb3JtYXQoc3RhbmRhcmRpemVEb2xsYXJzSW5EYXRhRnJhbWUocG9wdWxhcjUwLmRldGFpbCwgMjAwMCwgInVzYS5vcGVuaW5nLm1pbGxpb25zIiwgInllYXIiLCAidXNhLm9wZW5pbmcubWlsbGlvbnMyMDAwIiksc2NpZW50aWZpYz1GQUxTRSk7DQojIHBvcHVsYXI1MC5kZXRhaWwgPSBmb3JtYXQoc3RhbmRhcmRpemVEb2xsYXJzSW5EYXRhRnJhbWUocG9wdWxhcjUwLmRldGFpbCwgMjAwMCwgInVzYS5ncm9zcy5taWxsaW9ucyIsICJ5ZWFyIiwgInVzYS5ncm9zcy5taWxsaW9uczIwMDAiKSxzY2llbnRpZmljPUZBTFNFKTsNCiMgcG9wdWxhcjUwLmRldGFpbCA9IGZvcm1hdChzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAid29ybGQuZ3Jvc3MubWlsbGlvbnMiLCAieWVhciIsICJ3b3JsZC5ncm9zcy5taWxsaW9uczIwMDAiKSxzY2llbnRpZmljPUZBTFNFKTsNCiMgcG9wdWxhcjUwLmRldGFpbCA9IGZvcm1hdChzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAidXNhLnByb2ZpdC5taWxsaW9ucyIsICJ5ZWFyIiwgInVzYS5wcm9maXQubWlsbGlvbnMyMDAwIiksc2NpZW50aWZpYz1GQUxTRSk7DQojIHBvcHVsYXI1MC5kZXRhaWwgPSBmb3JtYXQoc3RhbmRhcmRpemVEb2xsYXJzSW5EYXRhRnJhbWUocG9wdWxhcjUwLmRldGFpbCwgMjAwMCwgIndvcmxkLnByb2ZpdC5taWxsaW9ucyIsICJ5ZWFyIiwgIndvcmxkLnByb2ZpdC5taWxsaW9uczIwMDAiKSxzY2llbnRpZmljPUZBTFNFKTsNCiMgcG9wdWxhcjUwLmRldGFpbCA9IGZvcm1hdChzdGFuZGFyZGl6ZURvbGxhcnNJbkRhdGFGcmFtZShwb3B1bGFyNTAuZGV0YWlsLCAyMDAwLCAiaW50ZXJuYXRpb25hbC5wcm9maXQubWlsbGlvbnMiLCAieWVhciIsICJpbnRlcm5hdGlvbmFsLnByb2ZpdC5taWxsaW9uczIwMDAiKSxzY2llbnRpZmljPUZBTFNFKTsNCg0KcG9wdWxhcjUwLmRldGFpbA0KYGBgDQoNCg0KYGBge3IgY3JlYXRlX3JhbmssIGVjaG89RkFMU0V9DQojY3JlYXRlIHJhbmtzIGZvciBtb25leQ0KDQpwb3B1bGFyNTAuZGV0YWlsID0gc29ydERhdGFGcmFtZUJ5TnVtZXJpY0NvbHVtbnMocG9wdWxhcjUwLmRldGFpbCwgImJ1ZGdldC5taWxsaW9uczIwMDAiLCAiREVTQyIpOyAgIyMgTkEncyBnbyB0byBlbmQgLi4uDQpwb3B1bGFyNTAuZGV0YWlsJHJhbmsuYnVkZ2V0ID0gMTpucm93KHBvcHVsYXI1MC5kZXRhaWwpOw0KDQoNCnBvcHVsYXI1MC5kZXRhaWwgPSBzb3J0RGF0YUZyYW1lQnlOdW1lcmljQ29sdW1ucyhwb3B1bGFyNTAuZGV0YWlsLCAidXNhLm9wZW5pbmcubWlsbGlvbnMyMDAwIiwgIkRFU0MiKTsNCnBvcHVsYXI1MC5kZXRhaWwkcmFuay51c2Eub3BlbmluZyA9IDE6bnJvdyhwb3B1bGFyNTAuZGV0YWlsKTsNCg0KDQpwb3B1bGFyNTAuZGV0YWlsID0gc29ydERhdGFGcmFtZUJ5TnVtZXJpY0NvbHVtbnMocG9wdWxhcjUwLmRldGFpbCwgInVzYS5ncm9zcy5taWxsaW9uczIwMDAiLCAiREVTQyIpOw0KcG9wdWxhcjUwLmRldGFpbCRyYW5rLnVzYS5ncm9zcyA9IDE6bnJvdyhwb3B1bGFyNTAuZGV0YWlsKTsNCg0KcG9wdWxhcjUwLmRldGFpbCA9IHNvcnREYXRhRnJhbWVCeU51bWVyaWNDb2x1bW5zKHBvcHVsYXI1MC5kZXRhaWwsICJ3b3JsZC5ncm9zcy5taWxsaW9uczIwMDAiLCAiREVTQyIpOw0KcG9wdWxhcjUwLmRldGFpbCRyYW5rLndvcmxkLmdyb3NzID0gMTpucm93KHBvcHVsYXI1MC5kZXRhaWwpOw0KDQpwb3B1bGFyNTAuZGV0YWlsID0gc29ydERhdGFGcmFtZUJ5TnVtZXJpY0NvbHVtbnMocG9wdWxhcjUwLmRldGFpbCwgImludGVybmF0aW9uYWwuZ3Jvc3MubWlsbGlvbnMyMDAwIiwgIkRFU0MiKTsNCnBvcHVsYXI1MC5kZXRhaWwkcmFuay5pbnRlcm5hdGlvbmFsLmdyb3NzID0gMTpucm93KHBvcHVsYXI1MC5kZXRhaWwpOw0KDQpwb3B1bGFyNTAuZGV0YWlsID0gc29ydERhdGFGcmFtZUJ5TnVtZXJpY0NvbHVtbnMocG9wdWxhcjUwLmRldGFpbCwgInVzYS5wcm9maXQubWlsbGlvbnMyMDAwIiwgIkRFU0MiKTsNCnBvcHVsYXI1MC5kZXRhaWwkcmFuay51c2EucHJvZml0ID0gMTpucm93KHBvcHVsYXI1MC5kZXRhaWwpOw0KDQpwb3B1bGFyNTAuZGV0YWlsID0gc29ydERhdGFGcmFtZUJ5TnVtZXJpY0NvbHVtbnMocG9wdWxhcjUwLmRldGFpbCwgIndvcmxkLnByb2ZpdC5taWxsaW9uczIwMDAiLCAiREVTQyIpOw0KcG9wdWxhcjUwLmRldGFpbCRyYW5rLndvcmxkLnByb2ZpdCA9IDE6bnJvdyhwb3B1bGFyNTAuZGV0YWlsKTsNCg0KcG9wdWxhcjUwLmRldGFpbCA9IHNvcnREYXRhRnJhbWVCeU51bWVyaWNDb2x1bW5zKHBvcHVsYXI1MC5kZXRhaWwsICJpbnRlcm5hdGlvbmFsLnByb2ZpdC5taWxsaW9uczIwMDAiLCAiREVTQyIpOw0KcG9wdWxhcjUwLmRldGFpbCRyYW5rLmludGVybmF0aW9uYWwucHJvZml0ID0gMTpucm93KHBvcHVsYXI1MC5kZXRhaWwpOw0KDQpwb3B1bGFyNTAuZGV0YWlsDQpgYGANCg0KYGBge3Igd2lsbF9kZW56ZWxfcG9wdWxhcjUwLCBlY2hvPUZBTFNFfQ0KIyB3aWxsLnBvcHVsYXIgPSBtZXJnZSh3aWxsLm1vdmllcywgcG9wdWxhcjUwLmRldGFpbCwgYnk9InR0aWQiKQ0KIyB3aWxsLnBvcHVsYXIgPSBzZWxlY3Qod2lsbC5wb3B1bGFyLCAteWVhci55KQ0KIyBjb2xuYW1lcyh3aWxsLnBvcHVsYXIpWzRdPSJ5ZWFyIg0KIyANCiMgZGVuemVsLnBvcHVsYXIgPSBtZXJnZShkZW56ZWwubW92aWVzLCBwb3B1bGFyNTAuZGV0YWlsLCBieT0idHRpZCIpDQojIGRlbnplbC5wb3B1bGFyID0gc2VsZWN0KGRlbnplbC5wb3B1bGFyLCAteWVhci55KQ0KIyBjb2xuYW1lcyhkZW56ZWwucG9wdWxhcilbNF09InllYXIiDQojIA0KIyB3aWxsLnBvcHVsYXI8LSB3aWxsLnBvcHVsYXJbd2l0aCh3aWxsLnBvcHVsYXIsIG9yZGVyKHllYXIpKSwgXQ0KIyB3aWxsLnBvcHVsYXINCiMgZGVuemVsLnBvcHVsYXI8LSBkZW56ZWwucG9wdWxhclt3aXRoKGRlbnplbC5wb3B1bGFyLCBvcmRlcih5ZWFyKSksIF0NCiMgZGVuemVsLnBvcHVsYXINCiMgDQpgYGANCg0KDQpgYGB7ciBiaWdnZXJfcG9uZCwgZWNobz1GQUxTRX0NCiNQT1BVTEFSIE1PVklFUyBGUk9NIDE5ODAgVEhST1VHSCAyMDE5DQpwb25kID0gc3Vic2V0RGF0YUZyYW1lKHBvcHVsYXI1MC5kZXRhaWwsICJ5ZWFyIiwgIj49IiwgMTk4MCkNCnBvbmQgPSBzdWJzZXREYXRhRnJhbWUocG9wdWxhcjUwLmRldGFpbCwgInllYXIiLCAiPCIsIDIwMjApDQpwb25kDQoNCiMgZGVuemVsIGFuZCB3aWxsIHBvcHB1bGFyIG1vdmllcyBiZXR3ZWVuIDE5ODAgdGhyb3VnaCAyMDE5ICANCg0Kd2lsbC5wb3B1bGFyID0gbWVyZ2Uod2lsbC5tb3ZpZXMsIHBvbmQsIGJ5PSJ0dGlkIikNCndpbGwucG9wdWxhciA9IHNlbGVjdCh3aWxsLnBvcHVsYXIsIC15ZWFyLnkpDQpjb2xuYW1lcyh3aWxsLnBvcHVsYXIpWzRdPSJ5ZWFyIg0KDQpkZW56ZWwucG9wdWxhciA9IG1lcmdlKGRlbnplbC5tb3ZpZXMsIHBvbmQsIGJ5PSJ0dGlkIikNCmRlbnplbC5wb3B1bGFyID0gc2VsZWN0KGRlbnplbC5wb3B1bGFyLCAteWVhci55KQ0KY29sbmFtZXMoZGVuemVsLnBvcHVsYXIpWzRdPSJ5ZWFyIg0KDQp3aWxsLnBvcHVsYXI8LSB3aWxsLnBvcHVsYXJbd2l0aCh3aWxsLnBvcHVsYXIsIG9yZGVyKHllYXIpKSwgXQ0Kd2lsbC5wb3B1bGFyDQpkZW56ZWwucG9wdWxhcjwtIGRlbnplbC5wb3B1bGFyW3dpdGgoZGVuemVsLnBvcHVsYXIsIG9yZGVyKHllYXIpKSwgXQ0KZGVuemVsLnBvcHVsYXINCg0KDQpgYGANCg0KYGBge3Igc3VtbWFyeV9jb21wYXJpc29ufQ0KDQpgYGANCg0KYGBge3J9DQp3aWxsLm4gPSBucm93KHdpbGwubW92aWVzKTsNCndpbGwubW92aWVzLnIgPSByZXBsYWNlRmFjdG9yQ29sdW1uV2l0aEluZGljYXRvclZhcmlhYmxlcyh3aWxsLm1vdmllcywgImdlbnJlIiwgImdlbnJlIiwgdXNlLmJvb2xlYW49RkFMU0UpOw0KIyBjb2xTdW1zKHdpbGwuY2FzdC5pbmZvLnJbLDExOjM0XSk7DQp3aWxsLmdlbnJlLnAgPSBzb3J0KGNvbFN1bXMod2lsbC5tb3ZpZXMuclssNzoyNF0pL3dpbGwubiwgZGVjcmVhc2luZyA9IFRSVUUpOyAgIyBwcm9wb3J0aW9uIGJ5IG1vdmllDQp3aWxsLmdlbnJlLnANCg0KZGVuemVsLm4gPSBucm93KGRlbnplbC5tb3ZpZXMpOw0KZGVuemVsLm1vdmllcy5yID0gcmVwbGFjZUZhY3RvckNvbHVtbldpdGhJbmRpY2F0b3JWYXJpYWJsZXMoZGVuemVsLm1vdmllcywgImdlbnJlIiwgImdlbnJlIiwgdXNlLmJvb2xlYW49RkFMU0UpOw0KIyBjb2xTdW1zKHdpbGwuY2FzdC5pbmZvLnJbLDExOjM0XSk7DQpkZW56ZWwuZ2VucmUucCA9IHNvcnQoY29sU3VtcyhkZW56ZWwubW92aWVzLnJbLDc6MjJdKS9kZW56ZWwubiwgZGVjcmVhc2luZyA9IFRSVUUpOyAgIyBwcm9wb3J0aW9uIGJ5IG1vdmllDQpkZW56ZWwuZ2VucmUucA0KDQpgYGANCg0KYGBge3J9DQoNCiMgDQojIGcgPC1nZ3Bsb3Qoc3ViLmRhdGEubG9uZywgYWVzKHg9YXMuZmFjdG9yKHR0aWQpKSkgKw0KIyAgIGdlb21fYmFyKGFlcyhmaWxsPWFzLmZhY3Rvcih0eXBlKSksIHdpZHRoID0gMC41KSsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCB2anVzdCA9IDAuNikpIA0KIyBnDQpgYGANCg0KYGBge3IgYm94X3Bsb3RzLCBlY2hvPUZBTFNFfQ0KI3BuZyhmaWxlPSJncmFwaHMvYm94X3Bsb3RfY29tcC5wbmciKQ0KDQpwYXIobWFyPWMoNSw5LDIsMSkpDQpib3hwbG90KHdpbGwucG9wdWxhciRyYW5rLnVzYS5vcGVuaW5nLCBkZW56ZWwucG9wdWxhciRyYW5rLnVzYS5vcGVuaW5nLCB3aWxsLnBvcHVsYXIkcmFuay51c2EuZ3Jvc3MsIGRlbnplbC5wb3B1bGFyJHJhbmsudXNhLmdyb3NzLCB3aWxsLnBvcHVsYXIkcmFuay5pbnRlcm5hdGlvbmFsLmdyb3NzLCBkZW56ZWwucG9wdWxhciRyYW5rLmludGVybmF0aW9uYWwuZ3Jvc3MsIHdpbGwucG9wdWxhciRyYW5rLnVzYS5wcm9maXQsIGRlbnplbC5wb3B1bGFyJHJhbmsudXNhLnByb2ZpdCwgd2lsbC5wb3B1bGFyJHJhbmsuaW50ZXJuYXRpb25hbC5wcm9maXQsIGRlbnplbC5wb3B1bGFyJHJhbmsuaW50ZXJuYXRpb25hbC5wcm9maXQsDQptYWluID0gIlJhbmsgY29tcGFyaXNvbiBpbiBwb3B1bGFyNTAgbGlzdCIsDQphdD1jKDEsMiw0LDUsNyw4LDEwLDExLDEzLDE0KSwNCnhsYWIgPSAicmFuayIsDQpuYW1lcyA9IGMoIndpbGwudXNhLm9wZW5pbmciLCJkZW56ZW4udXNhLm9wZW5pbmciLCJ3aWxsLnVzYS5ncm9zcyIsImRlbnplbC51c2EuZ3Jvc3MiLCJ3aWxsLmludC5ncm9zcyIsImRlbnplbC5pbnQuZ3Jvc3MiLCJ3aWxsLnVzYS5wcm9maXQiLCJkZW56ZWwudXNhLnByb2ZpdCIsIndpbGwuaW50LnByb2ZpdCIsImRlbnplbC5pbnQucHJvZml0IiksDQpjb2wgPSBjKCJvcmFuZ2UiLCAncmVkJyksDQpsYXM9MiwNCnlsaW0gPSBjKDAsMjAwMCksDQpib3JkZXIgPSAiYnJvd24iLA0KaG9yaXpvbnRhbCA9IFRSVUUsDQpub3RjaCA9IFRSVUUpDQpsZWdlbmQoeD0zLHk9MjAwMCxjKCJ3aWxsIiwiZGVuemVsIiksY2V4PS44LGNvbD1jKCJvcmFuZ2UiLCJyZWQiKSxsdHkgPSAxKQ0KI2Rldi5vZmYoKQ0KDQoNCndpbGwuZGVuemVsLm1lcmdlID0gcmJpbmQuZGF0YS5mcmFtZSh3aWxsLnBvcHVsYXIsIGRlbnplbC5wb3B1bGFyKQ0Kd2lsbC5kZW56ZWwubWVyZ2UNCg0KI3N1bW1hcnkod2lsbC5wb3B1bGFyJHZvdGVzKQ0KDQpwcmludCgiRGVuemVsIikNCnN1bW1hcnkoZGVuemVsLnBvcHVsYXJbLGMoNDE6NDgpXSkNCnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQ0KcHJpbnQoIldpbGwiKQ0Kc3VtbWFyeSh3aWxsLnBvcHVsYXJbLGMoNDE6NDgpXSkNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkocnN0YXRpeCkNCndpbGwuZGVuemVsLm1lcmdlJG5taWQgPC0gYXMuZmFjdG9yKHdpbGwuZGVuemVsLm1lcmdlJG5taWQpDQp3aWxsLmRlbnplbC5tZXJnZQ0KDQpjMSA9IHdpbGwuZGVuemVsLm1lcmdlICU+JQ0KICAgICAgIHRfdGVzdChyYXRpbmdzIH4gbm1pZCwgcGFpcmVkID0gRkFMU0UsIGFsdGVybmF0aXZlID0gImxlc3MiLCBkZXRhaWxlZCA9IFRSVUUpICU+JSBhZGRfc2lnbmlmaWNhbmNlKCkNCg0KYzIgPSB3aWxsLmRlbnplbC5tZXJnZSAlPiUgDQogICAgICAgdF90ZXN0KHZvdGVzIH4gbm1pZCwgcGFpcmVkID0gRkFMU0UsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBkZXRhaWxlZCA9IFRSVUUpICU+JSBhZGRfc2lnbmlmaWNhbmNlKCkNCg0KYzMgPSB3aWxsLmRlbnplbC5tZXJnZSAlPiUgDQogICAgICAgdF90ZXN0KGJ1ZGdldC5taWxsaW9uczIwMDAgfiBubWlkLCBwYWlyZWQgPSBGQUxTRSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGRldGFpbGVkID0gVFJVRSkgJT4lIGFkZF9zaWduaWZpY2FuY2UoKQ0KYzQgPSB3aWxsLmRlbnplbC5tZXJnZSAlPiUgDQogICAgICAgdF90ZXN0KHVzYS5wcm9maXQubWlsbGlvbnMyMDAwIH4gbm1pZCwgcGFpcmVkID0gRkFMU0UsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBkZXRhaWxlZCA9IFRSVUUpICU+JSBhZGRfc2lnbmlmaWNhbmNlKCkNCmM1ID0gd2lsbC5kZW56ZWwubWVyZ2UgJT4lIA0KICAgICAgIHRfdGVzdChpbnRlcm5hdGlvbmFsLnByb2ZpdC5taWxsaW9uczIwMDAgfiBubWlkLCBwYWlyZWQgPSBGQUxTRSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGRldGFpbGVkID0gVFJVRSkgJT4lIGFkZF9zaWduaWZpY2FuY2UoKQ0KDQp0YWJsZV9zaWcgPSByYmluZChjMSxjMixjMyxjNCxjNSkNCnRhYmxlX3NpZyA9IHRhYmxlX3NpZ1ssLWMoMTozKV0NCmNvbG5hbWVzKHRhYmxlX3NpZylbY29sbmFtZXModGFibGVfc2lnKSA9PSAiLnkuIl0gPC0gIlZhcmlhYmxlIg0KdGFibGVfc2lnJGdyb3VwMVt0YWJsZV9zaWckZ3JvdXAxPT0ibm0wMDAwMjI2Il0gPSAiV2lsbCBTbWl0aCINCnRhYmxlX3NpZyRncm91cDJbdGFibGVfc2lnJGdyb3VwMj09Im5tMDAwMDI0MyJdID0gIkRlbnplbCBXYXNoaWd0b24iDQp0YWJsZV9zaWcuc20gPSB0YWJsZV9zaWdbLGMoMTo4LDExOjEzKV0NCnRhYmxlX3NpZy5zbQ0KDQojcHJpbnQoeHRhYmxlKHRhYmxlX3NpZy5zbSwibGF0ZXgiKSwgZmlsZT0idGFibGVzL3RfdGVzdC50ZXgiKQ0KYGBgDQoNCmBgYHtyfQ0Kc3ViLmRhdGEgPSB3aWxsLmRlbnplbC5tZXJnZVssYygxOjIsNDE6NDYsNDgpXQ0KY29sbmFtZXMoc3ViLmRhdGEpPWMoInR0aWQiLCJubWlkIiwiYnVkZ2V0IiwidXNhLm9wZW5pbmciLCJ1c2EuZ3Jvc3MiLCJ3b3JsZC5ncm9zcyIsImludC5ncm9zcyIsInVzYS5wcm9maXQiLCJpbnQucHJvZml0IikNCnN1Yi5kYXRhJGJ1ZGdldCA9IC1zdWIuZGF0YSRidWRnZXQNCnN1Yi5kYXRhDQoNCnN1Yi5kYXRhLmxvbmcgPSBnYXRoZXIoc3ViLmRhdGEsIGtleSA9IHR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWlsbGlvbnMyMDAwLCAtYyh0dGlkLG5taWQpLCBuYS5ybSA9IEZBTFNFKQ0Kc3ViLmRhdGEubG9uZw0Kc3ViLmRhdGEubG9uZzI9c3ViLmRhdGEubG9uZ1tzdWIuZGF0YS5sb25nJHR5cGU9PSJidWRnZXQifHN1Yi5kYXRhLmxvbmckdHlwZT09InVzYS5ncm9zcyJ8c3ViLmRhdGEubG9uZyR0eXBlPT0iaW50Lmdyb3NzIixdDQpzdWIuZGF0YS5sb25nMg0KDQpzdWIuZGF0YS5sb25nMz1zdWIuZGF0YS5sb25nW3N1Yi5kYXRhLmxvbmckdHlwZT09ImJ1ZGdldCJ8c3ViLmRhdGEubG9uZyR0eXBlPT0id29ybGQuZ3Jvc3MiLF0NCg0KeCA8LSJ0dGlkIg0KeSA8LSAibWlsbGlvbnMyMDAwIg0KZmlsbGVyIDwtICJ0eXBlIg0KICAgIHAxIDwtZ2dwbG90KCkNCiBwMSsgZ2VvbV9iYXIoZGF0YT1zdWIuZGF0YS5sb25nMiwgYWVzX3N0cmluZyh4PXgseT15LCBmaWxsID1maWxsZXIpLHN0YXQ9ImlkZW50aXR5IikrDQogICBmYWNldF93cmFwKHZhcnMoYXMuZmFjdG9yKG5taWQpKSwgc3RyaXAucG9zaXRpb24gPSAiYm90dG9tIiwgc2NhbGVzID0gImZyZWVfeCIsICBucm93PTEpKw0KICAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMCwgImxpbmVzIiksDQogICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IiksDQogICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPWVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleSIpLA0KICAgICAgICAgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwNCiAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICd3aGl0ZScsIGNvbG91ciA9ICd3aGl0ZScpDQogICAgICAgICApDQogICAgIHAyIDwtZ2dwbG90KCkNCiBwMisgZ2VvbV9iYXIoZGF0YT1zdWIuZGF0YS5sb25nMywgYWVzX3N0cmluZyh4PXgseT15LCBmaWxsID1maWxsZXIpLHN0YXQ9ImlkZW50aXR5IikrDQogICBmYWNldF93cmFwKHZhcnMoYXMuZmFjdG9yKG5taWQpKSwgc3RyaXAucG9zaXRpb24gPSAiYm90dG9tIiwgc2NhbGVzID0gImZyZWVfeCIsICBucm93PTEpKw0KICAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMCwgImxpbmVzIiksDQogICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IiksDQogICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPWVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleSIpLA0KICAgICAgICAgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwNCiAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICd3aGl0ZScsIGNvbG91ciA9ICd3aGl0ZScpDQogICAgICAgICApDQpgYGANCg0KDQoNCg0KDQpgYGB7ciB3aWxsX3ZzX2RlbnplbF90YWJsZX0NCmxpYnJhcnkoeHRhYmxlKQ0KbGlicmFyeSh0YWJsZTEpDQoNCndpbGwudGFibGUgPSB3aWxsLnBvcHVsYXJbLGMoMyw1LDQsOSwxMSwxNCldDQp3aWxsLnRhYmxlID0gd2lsbC50YWJsZVt3aXRoKHdpbGwudGFibGUsb3JkZXIocmFuaykpLF0NCg0KZGVuemVsLnRhYmxlID0gZGVuemVsLnBvcHVsYXJbLGMoMyw1LDQsOSwxMSwxNCldDQpkZW56ZWwudGFibGUgPSBkZW56ZWwudGFibGVbd2l0aChkZW56ZWwudGFibGUsb3JkZXIocmFuaykpLF0NCg0KI3ByaW50KHh0YWJsZSh3aWxsLnRhYmxlLCB0eXBlID0gImxhdGV4IiksIGZpbGUgPSAidGFibGVzL3dpbGwudGFibGUudGV4IikNCiNwcmludCh4dGFibGUoZGVuemVsLnRhYmxlLCB0eXBlID0gImxhdGV4IiksIGZpbGUgPSAidGFibGVzL2RlbnplbC50YWJsZS50ZXgiKQ0KDQojIGxhYmVsKHdpbGwuZGVuemVsLm1lcmdlJHJhdGluZ3MpIDwtICJyYXRpbmdzIg0KIyBsYWJlbCh3aWxsLmRlbnplbC5tZXJnZSR2b3RlcykgPC0gInZvdGVzIg0KIyBsYWJlbCh3aWxsLmRlbnplbC5tZXJnZSRyYW5rLnBvcHVsYXIpIDwtICJyYW5rLnBvcHVsYXIiDQojIHRhYmxlMSh+cmF0aW5ncyArIHZvdGVzICsgcmFuay5wb3B1bGFyIHwgbm1pZCwgZGF0YSA9IHdpbGwuZGVuemVsLm1lcmdlKQ0KDQojIGxpYnJhcnkoa2FibGVFeHRyYSkNCiN3ZWJzaG90OjppbnN0YWxsX3BoYW50b21qcyhmb3JjZSA9IFRSVUUpDQojIGRmIDwtIHdpbGwucG9wdWxhclssYyg5LDExLDQxOjQ4KV0NCiMgZCA8LSBzdW1tYXJ5KGRmKQ0KIyBkICU+JQ0KIyAgIGtibChmb3JtYXQ9ImxhdGV4IixjYXB0aW9uID0gIkRlc2NyaXB0aXZlIGFuYWx5c2Ugb2YgV2lsbCBTbWl0aCBwb3B1bGFyIDUwIixib29rdGFicyA9IFRSVUUpICU+JQ0KIyAgIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IFQsIGh0bWxfZm9udCA9ICJDYW1icmlhIikNCiMgDQojIHByaW50KHh0YWJsZShkLCJsYXRleCIpLCBmaWxlPSJ0YWJsZXMvdGVzdC50ZXgiKQ0KDQpgYGA=